package com.hdwx.weike.dao;

import com.hdwx.weike.Utils.JdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class BaseDao {

    //--------插入数据sql语句拼接-----------
    // insert into 表名  [(字段名1，字段名2)] values (?，?);
    private String buildInsertSql(String table,String[] col,Object[] value){
        StringBuffer sql=new StringBuffer("insert into ");
        sql.append(table);// 添加表名称
        if(col!=null){
            sql.append(" (");
            //----------↓括号里的字段名↓---------
            for (String str : col) {
                sql.append(str).append(",");
            }
            sql.deleteCharAt(sql.length()-1);
            //----------↑括号里的字段名↑---------
            sql.append(")");
        }
        sql.append(" values ");
        sql.append("(");
        //-----------↓括号里的值↓------------------
        for (int i = 0; i < value.length; i++) {
            sql.append("?").append(",");
        }
        sql.deleteCharAt(sql.length()-1);
        //-----------↑括号里的值↑-------------------
        sql.append(")");
//		System.out.println(sql);
        return sql.toString();
    }
    //=====================往指定数据表中插入指定数据=====================
    public boolean insert(String table,String[] col,Object[] value){
        int deal_Id=1;
        String sql=buildInsertSql(table, col, value);
        System.out.println(sql.toString());
        return handleSql(sql, deal_Id, value, col);
    }

    // ----------修改数据sql语句拼接--------------
    //update 表名   set 字段1=值1，字段2=值2 where 条件
    private String buildChangeSql(String table,String[] col,String condition){
        StringBuffer sql=new StringBuffer("update ");
        sql.append(table).append(" set ");
        for (String str : col) {
            sql.append(str).append("=?,");
        }
        sql.deleteCharAt(sql.length()-1);
        sql.append(" where ").append(condition);
//		System.out.println(sql);
        return sql.toString();
    }
    //===================通过条件修改指定表的数据==================
    public boolean change(String table,String[] col,Object[] value,String condition){
        int deal_Id=3;
        String sql=buildChangeSql(table, col, condition);
        System.out.println(sql.toString());
        return handleSql(sql, deal_Id, value, col);
    }

    //---------------删除数据sql语句拼接----------
    // delete from 表名  where 条件
    private String buildDeleteSql(String table,String condition){
        StringBuffer sql=new StringBuffer("delete from ");
        sql.append(table).append(" where ").append(condition);
//		System.out.println(sql);
        return sql.toString();
    }
    // ==============通过条件删除数据表内容===============
    public boolean delete(String table,String condition){
        int deal_Id=2;
        String sql=buildDeleteSql(table, condition);
        System.out.println(sql.toString());
        return handleSql(sql, deal_Id, null, null);
    }

    //-----------条件查询sql语句拼接--------------
    // select 字段1，字段2 from 表名  [where  条件][limit ?,?]
    private String buildQuerySql(String table,String[] col,String condition,int[] limit){
        StringBuffer sql=new StringBuffer("select ");
        for (String str : col) {
            sql.append(str).append(",");
        }
        sql.deleteCharAt(sql.length()-1).append(" from ");
        sql.append(table);
        if(condition!=null){
            sql.append(" where ").append(condition);
        }
        if(limit!=null){
            sql.append(" limit ").append(limit[0]).append(",").append(limit[1]);
        }
//		System.out.println(sql);
        return sql.toString();
    }
    /**
     *
     * @param table   查询的表名
     * @param col     查询返回的字段名 数组
     * @param condition  where 条件
     * @param limit      limit 参数--数组
     * @return set     查询语句查询后返回的结果集
     * @throws SQLException
     */
    //============条件查询，返回结果集，让子类处理==================
    public ResultSet query(String table,String[] col,String condition,int[] limit) throws SQLException{
        Connection con=null;
        PreparedStatement statement=null;
        //获取连接对象
        con= JdbcUtils.getConnection();
        //创建预处理对象
        String sql=buildQuerySql(table, col, condition, limit);
        statement=con.prepareStatement(sql);
        //执行预处理的查询语句，返回结果集
        ResultSet set=statement.executeQuery();
        return set;
    }
    //crud综合操作
    public boolean handleSql(String sql,int deal_Id,Object[] value,String[] col){
        Connection con=null;
        PreparedStatement statement=null;
        ResultSet set=null;
        try {
            //获取连接对象
            con=JdbcUtils.getConnection();
            //创建预处理对象
            statement=con.prepareStatement(sql);
            int i=0;
            switch(deal_Id){//不同处理方式
                case 1:// 插入数据
                    for (int j = 0; j < value.length; j++) {
                        statement.setObject(j+1, value[j]);
                    }
                    //执行预处理的数据插入语句，返回数据修改成功的行数
                    i=statement.executeUpdate();
                    if(i>0){
                        System.out.println("数据添加成功！共操作了"+i+"条数据！");
                        return true;
                    }else{
                        System.out.println("····数据添加失败！");
                    }
                    break;
                case 2:// 删除数据
                    i=statement.executeUpdate();
                    if(i>0){
                        System.out.println("数据删除成功！共操作了"+i+"条数据！");
                        return true;
                    }else{
                        System.out.println("·······数据删除失败！");
                    }
                    break;
                case 3:// 修改数据
                    for (int j = 0; j < value.length; j++) {
                        statement.setObject(j+1, value[j]);
                    }
                    //执行预处理的修改语句,返回修改成功的行数
                    i=statement.executeUpdate();
                    if(i>0){
                        System.out.println("数据修改成功！共操作了"+i+"条数据！");
                        return true;
                    }else{
                        System.out.println("······数据修改失败！");
                    }
                    break;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            JdbcUtils.close(set, statement, con);
        }
        return false;
    }
	/*
	public static void main(String[] args) {
		BaseDao1 t=new BaseDao1();

		String[] col={"id","username","pwd"};//字段名
		Object[] value={8,"admin1","admin1"};// 值
		String table="users";          //表名
		String condition="id>1";       //where条件
		String condition1=null;
		int[] limit={0,9};				//limit
		//插入数据
//		System.out.println(t.insert(table, col, value));
		//修改数据
//		System.out.println(t.change(table, col, value, condition));
		//删除数据
//		System.out.println(t.delete(table, condition));
		//查询数据
		t.buildQuerySql(table, col, condition, limit);
	}*/
}
